﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Runtime.Serialization;
using System.ComponentModel;

namespace elr_tracking_bal.CAT
{
    public class TerminoEnvio : INotifyPropertyChanged
    {
        private int _ID_TERMINO_ENVIO;
        private string _CLAVE;
        private string _TERMINO;
        private string _SIGNIFICADO;
        private string _GENERA_LOTES;

        public int ID_TERMINO_ENVIO
        {
            get
            {
                return _ID_TERMINO_ENVIO;
            }
            set
            {
                if (_ID_TERMINO_ENVIO != value)
                {
                    _ID_TERMINO_ENVIO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("ID_TERMINO_ENVIO"));
                    }
                }

            }
        }

        public string CLAVE
        {
            get
            {
                return _CLAVE;
            }
            set
            {
                if (_CLAVE != value)
                {
                    _CLAVE = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("CLAVE"));
                    }
                }
            }
        }

        public string TERMINO
        {
            get
            {
                return _TERMINO;
            }
            set
            {
                if (_TERMINO != value)
                {
                    _TERMINO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("TERMINO"));
                    }
                }

            }
        }

        public string SIGNIFICADO
        {
            get
            {
                return _SIGNIFICADO;
            }
            set
            {
                if (_SIGNIFICADO != value)
                {
                    _SIGNIFICADO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("SIGNIFICADO"));
                    }
                }
            }
        }

        public string GENERA_LOTES
        {
            get
            {
                return _GENERA_LOTES;
            }
            set
            {
                if (_GENERA_LOTES != value)
                {
                    _GENERA_LOTES = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("GENERA_LOTES"));
                    }
                }
            }
        }
        /// <summary>
        /// Método que ejecuta un store para obtener los Termino de Envío
        /// </summary>
        /// <returns></returns>
        public static DataTable GetData()
        {
            DataTable dt;
            dt = elr_tracking_dal.SrvDB.ExecuteQuery("exec SP_GETLIST_CAT_TERMINO_ENVIO");
            return dt;
        }
        /// <summary>
        /// Método para obtener la lista de Termino de Envío
        /// </summary>
        /// <returns></returns>
        public static List<TerminoEnvio> GetDataTerminoEnvio()
        {
            try
            {
                DataTable dt;
                dt = TerminoEnvio.GetData();
                if (dt.Rows.Count == 0)
                {
                    return null;
                }
                else
                {
                    List<TerminoEnvio> list = dt.AsEnumerable().Select(
                        row => new TerminoEnvio
                        {
                            ID_TERMINO_ENVIO = row.Field<int?>("ID_TERMINO_ENVIO").GetValueOrDefault(),
                            CLAVE = String.IsNullOrEmpty(row.Field<string>("CLAVE")) ? "" : row.Field<string>("CLAVE"),
                            TERMINO = String.IsNullOrEmpty(row.Field<string>("TERMINO")) ? "" : row.Field<string>("TERMINO"),
                            SIGNIFICADO = String.IsNullOrEmpty(row.Field<string>("SIGNIFICADO")) ? "" : row.Field<string>("SIGNIFICADO"),
                            GENERA_LOTES = String.IsNullOrEmpty(row.Field<string>("GENERA_LOTES")) ? "" : row.Field<string>("GENERA_LOTES"),
                        }
                        ).ToList();
                    return list;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Método para insertar un Termino Envío
        /// </summary>
        /// <param name="cat"></param>
        /// <returns></returns>
        public static elr_tracking_bal.UpsertStateMsg InsertTerminoEnvio(TerminoEnvio cat)
        {
            TerminoEnvio inser;
            UpsertStateMsg inserCat;
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_INSERT_CAT_TERMINO_ENVIO '" + cat.CLAVE + "','" + cat.TERMINO + "','" + cat.SIGNIFICADO + "','" + cat.GENERA_LOTES + "'");

                inser = new TerminoEnvio(cat.CLAVE, cat.TERMINO, cat.SIGNIFICADO, cat.GENERA_LOTES);
                inserCat = new UpsertStateMsg("Registros guardados " + dt.ToString(), true);
                return inserCat;
            }
            catch (Exception ex)
            {
                inserCat = new UpsertStateMsg("Error al guardar " + ex, false);
                return inserCat;
            }
        }
        /// <summary>
        /// Método para eliminar Terminos de Envío
        /// </summary>
        /// <param name="ID_TERMINO_ENVIO"></param>
        /// <returns></returns>
        public static elr_tracking_bal.DeleteStateMsg DeleteTerminoEnvio(string[] ID_TERMINO_ENVIO)
        {
            elr_tracking_bal.DeleteStateMsg delete;
            string join;
            if (ID_TERMINO_ENVIO == null)
            {
                join = "";
            }
            else
            {
                join = String.Join(",", ID_TERMINO_ENVIO);
            }
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_DELETE_CAT_TERMINO_ENVIO '" + join + "'");
                delete = new elr_tracking_bal.DeleteStateMsg("Registro eliminado" + dt.ToString(), true);
                return delete;
            }
            catch (Exception ex)
            {
                delete = new elr_tracking_bal.DeleteStateMsg("Error al eliminar" + ex, false);
                return delete;
            }
        }
        /// <summary>
        ///Método que actualiza un Termino de Envío
        /// </summary>
        /// <param name="cat"></param>
        /// <returns></returns>
        public static elr_tracking_bal.UpsertStateMsg UpdateTerminoEnvio(TerminoEnvio cat)
        {
            TerminoEnvio update;
            UpsertStateMsg updateCat;
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_UPDATE_CAT_TERMINO_ENVIO " + cat.ID_TERMINO_ENVIO + ",'" + cat.CLAVE + "','" + cat.TERMINO + "','" + cat.SIGNIFICADO + "','" + cat.GENERA_LOTES + "'");
                update = new TerminoEnvio(cat.ID_TERMINO_ENVIO,cat.CLAVE,cat.TERMINO,cat.SIGNIFICADO,cat.GENERA_LOTES);
                updateCat = new UpsertStateMsg("Registros actualizados " + dt.ToString(), true);
                return updateCat;
            }
            catch (Exception ex)
            {
                updateCat = new UpsertStateMsg("Error al actualizar " + ex, false);
                return updateCat;
            }
        }
        /// <summary>
        /// Método que obtiene un Termino de Envío
        /// </summary>
        /// <param name="ID_TERMINO_ENVIO"></param>
        /// <returns></returns>
        public static TerminoEnvio GetOneTerminoEnvio(int ID_TERMINO_ENVIO)
        {
            try
            {
                TerminoEnvio cat;
                DataTable dt = elr_tracking_dal.SrvDB.ExecuteQuery("exec SP_GETONE_CAT_TERMINO_ENVIO " + ID_TERMINO_ENVIO + "");
                if (dt.Rows.Count == 0)
                {
                    return null;
                }
                else if (ID_TERMINO_ENVIO == 0)
                {
                    return null;
                }
                else
                {
                    cat = new TerminoEnvio(Convert.ToInt32(dt.Rows[0]["ID_TERMINO_ENVIO"]), Convert.ToString(dt.Rows[0]["CLAVE"]), Convert.ToString(dt.Rows[0]["TERMINO"]), Convert.ToString(dt.Rows[0]["SIGNIFICADO"]), Convert.ToString(dt.Rows[0]["GENERA_LOTES"]));
                }
                return cat;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Constructor sin parámetros
        /// </summary>
        public TerminoEnvio() { }
        /// <summary>
        /// Constructor con tres parámetros
        /// </summary>
        /// <param name="CLAVE"></param>
        /// <param name="TERMINO"></param>
        /// <param name="SIGNIFICADO"></param>
        public TerminoEnvio(string CLAVE, string TERMINO, string SIGNIFICADO)
        {
            this.CLAVE = CLAVE;
            this.TERMINO = TERMINO;
            this.SIGNIFICADO = SIGNIFICADO;
        }
        /// <summary>
        /// Constructor con cuatro parámetros
        /// </summary>
        /// <param name="CLAVE"></param>
        /// <param name="TERMINO"></param>
        /// <param name="SIGNIFICADO"></param>
        /// <param name="GENERA_LOTES"></param>
        public TerminoEnvio(string CLAVE, string TERMINO, string SIGNIFICADO, string GENERA_LOTES)
        {
            this.CLAVE = CLAVE;
            this.TERMINO = TERMINO;
            this.SIGNIFICADO = SIGNIFICADO;
            this.GENERA_LOTES = GENERA_LOTES;
        }
        /// <summary>
        /// Constructor con cinco parámetros
        /// </summary>
        /// <param name="ID_TERMINO_ENVIO"></param>
        /// <param name="CLAVE"></param>
        /// <param name="TERMINO"></param>
        /// <param name="SIGNIFICADO"></param>
        /// <param name="GENERA_LOTES"></param>
        public TerminoEnvio(int ID_TERMINO_ENVIO, string CLAVE, string TERMINO, string SIGNIFICADO, string GENERA_LOTES)
        {
            this._ID_TERMINO_ENVIO = ID_TERMINO_ENVIO;
            this._CLAVE = CLAVE;
            this._TERMINO = TERMINO;
            this._SIGNIFICADO = SIGNIFICADO;
            this._GENERA_LOTES = GENERA_LOTES;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}